import base64
import json
import uuid
import time
from datetime import datetime, UTC
from PIL import Image
import io


# 假设此模块中的部分函数和类来源于 MCP-Chinese-Getting-Started-Guide 项目
# 该示例模拟图像上下文数据的封装与映射过程

class ImageContext:
    """
    图像上下文类，用于封装原始图像数据与语义描述，
    并将其转化为符合MCP协议的结构化Prompt对象
    """

    def __init__(self, image_path: str, description: str):
        self.image_path = image_path  # 图像文件路径
        self.description = description  # 图像的语义描述信息
        self.id = str(uuid.uuid4())  # 唯一标识，用于上下文链引用
        self.timestamp = datetime.now(UTC).isoformat()  # 图像封装时间

    def preprocess_image(self) -> bytes:
        """
        对图像进行预处理，例如尺寸调整与格式转换
        返回处理后的图像二进制数据
        """
        # 打开图像并调整为固定尺寸
        with Image.open(self.image_path) as img:
            # 将图像调整为标准尺寸(如256x256)
            img = img.resize((256, 256))
            # 将图像转换为JPEG格式并保存到内存缓冲区
            buffer = io.BytesIO()
            img.save(buffer, format="JPEG")
            return buffer.getvalue()

    def encode_image_to_base64(self) -> str:
        """
        将预处理后的图像二进制数据编码为Base64字符串
        """
        image_data = self.preprocess_image()
        # 使用Base64进行编码，并解码为utf-8字符串
        encoded_str = base64.b64encode(image_data).decode("utf-8")
        return encoded_str

    def to_prompt(self) -> dict:
        """
        将图像上下文转化为符合MCP协议的Prompt对象，
        包含角色、内容、状态及其他元数据
        """
        prompt = {
            "id": self.id,
            "role": "image",  # 图像上下文一般标识为image角色
            "content": self.encode_image_to_base64(),  # 图像数据以Base64形式封装
            "metadata": {
                "description": self.description,
                "timestamp": self.timestamp,
                "format": "jpeg",
                "width": 256,
                "height": 256
            },
            "status": "active"  # 表示该图像Prompt当前处于活跃状态
        }
        return prompt


def merge_context(prompts: list) -> dict:
    """
    将多个Prompt对象整合到一个统一的上下文请求结构中，
    用于传递给模型调用
    """
    context_request = {
        "model": "deepseek-chat",
        "prompts": prompts,
        "config": {
            "temperature": 0.6,
            "max_tokens": 512,
            "stream": False
        },
        "metadata": {
            "request_id": str(uuid.uuid4()),
            "caller": "mcp-image-module",
            "timestamp": datetime.now(UTC).isoformat(),
            "env": "production"
        }
    }
    return context_request


def main():
    # 定义图像文件路径（使用chapter4目录下的sample.jpg图像）
    image_path = "sample.jpg"
    image_description = "一张展示自然风景的照片，包含蓝天、白云和绿草。"

    # 创建图像上下文对象
    img_context = ImageContext(image_path, image_description)

    # 将图像上下文转换为Prompt格式
    image_prompt = img_context.to_prompt()

    # 构建完整的上下文请求（此处仅包含一个图像Prompt，可扩展至多模态）
    mcp_request = merge_context([image_prompt])

    # 将请求转换为JSON格式并输出
    request_json = json.dumps(mcp_request, ensure_ascii=False, indent=2)
    print("=== 构建的MCP上下文请求 ===")
    print(request_json)

    # 模拟一个处理延迟，代表模型调用过程
    time.sleep(1)
    simulated_response = {
        "status": "success",
        "trace_id": str(uuid.uuid4()),
        "outputs": [
            {
                "role": "assistant",
                "content": "模型收到图像上下文，生成相关描述：这是一张展示自然风景的照片，整体色彩明快，视觉效果良好。"
            }
        ]
    }
    response_json = json.dumps(simulated_response, ensure_ascii=False, indent=2)
    print("\n=== 模拟模型响应 ===")
    print(response_json)


if __name__ == "__main__":
    main()
